From bd7678c78dd4dae87276c5b8783927461f78117e Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Sat, 16 Mar 2002 23:30:44 +0000 Subject: [PATCH] just return when we have an input_only window (fix by Owen Taylor) Sat Mar 16 23:54:56 2002 Kristian Rietveld * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just return when we have an input_only window (fix by Owen Taylor) * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add scroll_sync_timer * gtk/gtktreeview.c (install_scroll_sync_handler): new function, (scroll_sync_handler): ditto, (gtk_tree_view_unrealize): take scroll_sync_timer into account (gtk_tree_view_row_deleted): install scroll_sync_timer instead of calling top_row_to_dy/dy_to_top_row directly -- this greatly speeds up clearing the model (#73199) * gtk/gtktreemodelsort.c (gtk_tree_model_sort_convert_path_to_child_path): fix up this function, for some reason I really screwed it up (fixes #74663) --- ChangeLog | 19 ++++++++++++++++++ ChangeLog.pre-2-10 | 19 ++++++++++++++++++ ChangeLog.pre-2-2 | 19 ++++++++++++++++++ ChangeLog.pre-2-4 | 19 ++++++++++++++++++ ChangeLog.pre-2-6 | 19 ++++++++++++++++++ ChangeLog.pre-2-8 | 19 ++++++++++++++++++ gdk/x11/gdkwindow-x11.c | 5 +++++ gtk/gtktreemodelsort.c | 4 +++- gtk/gtktreeprivate.h | 1 + gtk/gtktreeview.c | 44 ++++++++++++++++++++++++++++++++++++----- 10 files changed, 162 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 801b3be608..16a8effcce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +Sat Mar 16 23:54:56 2002 Kristian Rietveld + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just + return when we have an input_only window (fix by Owen Taylor) + + * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add + scroll_sync_timer + + * gtk/gtktreeview.c (install_scroll_sync_handler): new function, + (scroll_sync_handler): ditto, + (gtk_tree_view_unrealize): take scroll_sync_timer into account + (gtk_tree_view_row_deleted): install scroll_sync_timer instead of + calling top_row_to_dy/dy_to_top_row directly + -- this greatly speeds up clearing the model (#73199) + + * gtk/gtktreemodelsort.c + (gtk_tree_model_sort_convert_path_to_child_path): fix up this function, + for some reason I really screwed it up (fixes #74663) + 2002-03-16 Sven Neumann * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 801b3be608..16a8effcce 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,22 @@ +Sat Mar 16 23:54:56 2002 Kristian Rietveld + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just + return when we have an input_only window (fix by Owen Taylor) + + * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add + scroll_sync_timer + + * gtk/gtktreeview.c (install_scroll_sync_handler): new function, + (scroll_sync_handler): ditto, + (gtk_tree_view_unrealize): take scroll_sync_timer into account + (gtk_tree_view_row_deleted): install scroll_sync_timer instead of + calling top_row_to_dy/dy_to_top_row directly + -- this greatly speeds up clearing the model (#73199) + + * gtk/gtktreemodelsort.c + (gtk_tree_model_sort_convert_path_to_child_path): fix up this function, + for some reason I really screwed it up (fixes #74663) + 2002-03-16 Sven Neumann * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 801b3be608..16a8effcce 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,22 @@ +Sat Mar 16 23:54:56 2002 Kristian Rietveld + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just + return when we have an input_only window (fix by Owen Taylor) + + * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add + scroll_sync_timer + + * gtk/gtktreeview.c (install_scroll_sync_handler): new function, + (scroll_sync_handler): ditto, + (gtk_tree_view_unrealize): take scroll_sync_timer into account + (gtk_tree_view_row_deleted): install scroll_sync_timer instead of + calling top_row_to_dy/dy_to_top_row directly + -- this greatly speeds up clearing the model (#73199) + + * gtk/gtktreemodelsort.c + (gtk_tree_model_sort_convert_path_to_child_path): fix up this function, + for some reason I really screwed it up (fixes #74663) + 2002-03-16 Sven Neumann * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 801b3be608..16a8effcce 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,22 @@ +Sat Mar 16 23:54:56 2002 Kristian Rietveld + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just + return when we have an input_only window (fix by Owen Taylor) + + * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add + scroll_sync_timer + + * gtk/gtktreeview.c (install_scroll_sync_handler): new function, + (scroll_sync_handler): ditto, + (gtk_tree_view_unrealize): take scroll_sync_timer into account + (gtk_tree_view_row_deleted): install scroll_sync_timer instead of + calling top_row_to_dy/dy_to_top_row directly + -- this greatly speeds up clearing the model (#73199) + + * gtk/gtktreemodelsort.c + (gtk_tree_model_sort_convert_path_to_child_path): fix up this function, + for some reason I really screwed it up (fixes #74663) + 2002-03-16 Sven Neumann * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 801b3be608..16a8effcce 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,22 @@ +Sat Mar 16 23:54:56 2002 Kristian Rietveld + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just + return when we have an input_only window (fix by Owen Taylor) + + * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add + scroll_sync_timer + + * gtk/gtktreeview.c (install_scroll_sync_handler): new function, + (scroll_sync_handler): ditto, + (gtk_tree_view_unrealize): take scroll_sync_timer into account + (gtk_tree_view_row_deleted): install scroll_sync_timer instead of + calling top_row_to_dy/dy_to_top_row directly + -- this greatly speeds up clearing the model (#73199) + + * gtk/gtktreemodelsort.c + (gtk_tree_model_sort_convert_path_to_child_path): fix up this function, + for some reason I really screwed it up (fixes #74663) + 2002-03-16 Sven Neumann * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 801b3be608..16a8effcce 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,22 @@ +Sat Mar 16 23:54:56 2002 Kristian Rietveld + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just + return when we have an input_only window (fix by Owen Taylor) + + * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add + scroll_sync_timer + + * gtk/gtktreeview.c (install_scroll_sync_handler): new function, + (scroll_sync_handler): ditto, + (gtk_tree_view_unrealize): take scroll_sync_timer into account + (gtk_tree_view_row_deleted): install scroll_sync_timer instead of + calling top_row_to_dy/dy_to_top_row directly + -- this greatly speeds up clearing the model (#73199) + + * gtk/gtktreemodelsort.c + (gtk_tree_model_sort_convert_path_to_child_path): fix up this function, + for some reason I really screwed it up (fixes #74663) + 2002-03-16 Sven Neumann * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 6d2aa0c6cb..a2a61ed69e 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -3906,9 +3906,14 @@ static void gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on) { XSetWindowAttributes xattributes; + GdkWindowObject *private; guint xattributes_mask = 0; g_return_if_fail (window != NULL); + + private = GDK_WINDOW_OBJECT (window); + if (private->input_only) + return; xattributes.bit_gravity = StaticGravity; xattributes_mask |= CWBitGravity; diff --git a/gtk/gtktreemodelsort.c b/gtk/gtktreemodelsort.c index 6ae397e683..1869090759 100644 --- a/gtk/gtktreemodelsort.c +++ b/gtk/gtktreemodelsort.c @@ -1964,14 +1964,16 @@ gtk_tree_model_sort_convert_path_to_child_path (GtkTreeModelSort *tree_model_sor for (i = 0; i < gtk_tree_path_get_depth (sorted_path); i++) { if ((level == NULL) || - (level->array->len > sorted_indices[i])) + (level->array->len <= sorted_indices[i])) { gtk_tree_path_free (retval); return NULL; } if (g_array_index (level->array, SortElt, sorted_indices[i]).children == NULL) gtk_tree_model_sort_build_level (tree_model_sort, level, &g_array_index (level->array, SortElt, sorted_indices[i])); + if (level == NULL) + break; gtk_tree_path_append_index (retval, g_array_index (level->array, SortElt, i).offset); } diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h index 6e11fc367c..75c84db2b1 100644 --- a/gtk/gtktreeprivate.h +++ b/gtk/gtktreeprivate.h @@ -116,6 +116,7 @@ struct _GtkTreeViewPrivate GtkTreeViewColumn *edited_column; guint presize_handler_timer; guint validate_rows_timer; + guint scroll_sync_timer; /* Focus code */ GtkTreeViewColumn *focus_column; diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 66d48b2527..87a80084c8 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -42,6 +42,7 @@ #define GTK_TREE_VIEW_SEARCH_DIALOG_KEY "gtk-tree-view-search-dialog" #define GTK_TREE_VIEW_PRIORITY_VALIDATE (GDK_PRIORITY_REDRAW + 5) +#define GTK_TREE_VIEW_PRIORITY_SCROLL_SYNC (GTK_TREE_VIEW_PRIORITY_VALIDATE + 2) #define GTK_TREE_VIEW_NUM_ROWS_PER_IDLE 500 #define SCROLL_EDGE_SIZE 15 #define EXPANDER_EXTRA_PADDING 4 @@ -263,6 +264,7 @@ static void validate_visible_area (GtkTreeView *tree_view); static gboolean validate_rows_handler (GtkTreeView *tree_view); static gboolean presize_handler_callback (gpointer data); static void install_presize_handler (GtkTreeView *tree_view); +static void install_scroll_sync_handler (GtkTreeView *tree_view); static void gtk_tree_view_dy_to_top_row (GtkTreeView *tree_view); static void gtk_tree_view_top_row_to_dy (GtkTreeView *tree_view); @@ -1357,6 +1359,12 @@ gtk_tree_view_unrealize (GtkWidget *widget) tree_view->priv->validate_rows_timer = 0; } + if (tree_view->priv->scroll_sync_timer != 0) + { + gtk_timeout_remove (tree_view->priv->scroll_sync_timer); + tree_view->priv->scroll_sync_timer = 0; + } + for (list = tree_view->priv->columns; list; list = list->next) _gtk_tree_view_column_unrealize_button (GTK_TREE_VIEW_COLUMN (list->data)); @@ -4048,6 +4056,34 @@ install_presize_handler (GtkTreeView *tree_view) } } +static gboolean +scroll_sync_handler (GtkTreeView *tree_view) +{ + + GDK_THREADS_ENTER (); + + if (gtk_tree_row_reference_valid (tree_view->priv->top_row)) + gtk_tree_view_top_row_to_dy (tree_view); + else + gtk_tree_view_dy_to_top_row (tree_view); + + tree_view->priv->scroll_sync_timer = 0; + + GDK_THREADS_LEAVE (); + + return FALSE; +} + +static void +install_scroll_sync_handler (GtkTreeView *tree_view) +{ + if (!tree_view->priv->scroll_sync_timer) + { + tree_view->priv->scroll_sync_timer = + g_idle_add_full (GTK_TREE_VIEW_PRIORITY_SCROLL_SYNC, (GSourceFunc) scroll_sync_handler, tree_view, NULL); + } +} + /* Always call this iff dy is in the visible range. If the tree is empty, then * it's set to be NULL, and top_row_dy is 0; */ @@ -4103,6 +4139,7 @@ gtk_tree_view_top_row_to_dy (GtkTreeView *tree_view) gtk_tree_row_reference_free (tree_view->priv->top_row); tree_view->priv->top_row = NULL; tree_view->priv->top_row_dy = 0; + /* DO NOT install the idle handler */ gtk_tree_view_dy_to_top_row (tree_view); return; } @@ -4110,7 +4147,7 @@ gtk_tree_view_top_row_to_dy (GtkTreeView *tree_view) if (MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size) < tree_view->priv->top_row_dy) { - /* new top row */ + /* new top row -- do NOT install the idle handler */ gtk_tree_view_dy_to_top_row (tree_view); return; } @@ -5835,10 +5872,7 @@ gtk_tree_view_row_deleted (GtkTreeModel *model, _gtk_rbtree_remove_node (tree, node); } - if (gtk_tree_row_reference_valid (tree_view->priv->top_row)) - gtk_tree_view_top_row_to_dy (tree_view); - else - gtk_tree_view_dy_to_top_row (tree_view); + install_scroll_sync_handler (tree_view); gtk_widget_queue_resize (GTK_WIDGET (tree_view)); -- 2.30.2